// 正则表达式
// Regular Expression 又叫规则表达式, 描述了匹配字符串的模式(规则), 通过正则, 我们可以很方便的处理字符串, 比如替换, 删除复合规则的字符串中的子串

// 定义正则方式1
// 第一个参数: 匹配的规则, 模式(字符串)
// 第二个参数: attributes, 比如: i, g, m, 可选, i: 忽略大小写, m: 多行匹配, g: 全局匹配
var reg = new RegExp("ab", "i");
var str = "slafAbcs";
var r = reg.test(str);
console.log(r);

// 定义正则方式2
reg = /ab/i;
console.log(reg.test("abcd"));

//正则对象方法
// test方法
// 检测一个字符串是否满足匹配模式, 如果满足返回true, 否则返回false
// 需要一个参数: 字符串

// 正则表达式中的字符
// 普通字符 a-z, A-Z等
// 元字符, 具有特殊含义的字符, 可以规定前导字符(出现在元字符前面的字符)出现的模式, 比如: ?, +, *等等


// 特殊字符
/*
	\n: 换行
	\t: 水平制表符
	\v: 垂直
		   制表符
	\r: 回车
	\d: 数字
	\D: 非数字
	\w: 普通字符(数字, 字母, 下划线)
	\W: 非数字, 字母, 下划线
	\s: 空白符, (空格, 回车, 制表符)
	\S: 非空白符
	. : 除\n之外的字符
	[]: 匹配括号中出现的字符
	[^]: 匹配括号中没有出现的字符
*/

reg = /\n/;
console.log(reg.test("safjlsal\nsdf"));
str = "\n\n\n\n";
reg = /./;
console.log(reg.test(str));
reg = /\S/;
console.log(reg.test("\n\n\t\v"));

// 判断字符串中是否包含a或者b或者c
str = "sdjoieodsf";
reg = /[abc]/;
console.log(reg.test(str));

// 匹配 .
reg = /\./;
console.log(reg.test("1.231"));

// 匹配abc之外的字符
reg = /[^abc]/;
str = "abcd";
console.log(reg.test(str));

// 连字符 -
// [0-9] 代表0-9的字符
// [A-Z] 代表大写字母
// [a-z] 代表小写字母
// \w  [0-9][A-Z][a-z]
// [a-z][A-Z] 所有字母
// 判断是否有数字(5-9)的正则
reg = /[5-9]/;
console.log(reg.test(5));

// exec
// 返回一个数组, 第一个元素: 匹配的字符串 第二个元素: 匹配的字符串所在下标, 第三个参数: 输入的字符串
str = "I love you, I love you, I love you";
reg = /love/g;
// var arr = reg.exec(str);
// console.log(arr);
// 下次检索字符串的开始位置
// console.log(reg.lastIndex);
// arr = reg.exec(str);
// console.log(arr);
// console.log(reg.lastIndex);

// arr = reg.exec(str);
// console.log(arr);
// console.log(reg.lastIndex);

// arr = reg.exec(str);
// console.log(arr);
// console.log(reg.lastIndex);

var result;
while (result = reg.exec(str)) {
	console.log(result);
	document.write("匹配的字符串:" + result[0] + ", 位置: " + result.index + "<br>");
}

// 坑
var str1 = "abcd";
var str2 = "cabd";
reg = /ab/g;
console.log(reg.test(str1));
console.log(reg.lastIndex);
console.log(reg.test(str2));


// 字符串方法
// match方法
str = "I  love love love you";
result = str.match("love");
console.log("-------");
console.log(result);

// 返回所有匹配的子串
result = str.match(/love/g);
console.log(result);


// search方法
// 匹配字符串中第一次出现数字的位置, 如果查找不到, 返回-1
str = "sjadfl33ljslkdfj";
result = str.search(/\d/);
console.log(result);

str = "sdfj3kasjfd32sfdjal23";
// + 代表前面的\d出现次数 >= 1
result = str.split(/\d+/);
console.log(result);

// replace 替换
str = "I love love you";
result = str.replace("love", "hate");
console.log(result);

// 第二个参数可以是字符串, 也可以是回调函数
result = str.replace(/love/g, "hate");
console.log(result);
console.log("------");
// 回调第一个参数: 匹配的子串, 第二个参数: 匹配的子串的下标
result = str.replace(/love/g, function(str, index) {
	console.log(str, index);
	return str.toUpperCase();
});
console.log(result);


// 把字符串中的像素扩大两倍
str = 'style="width: 200px; height: 200px; top: 50px; left: 80px; line-height: 1rem;"';
reg = /\d+px/g;
result = str.replace(reg, function(s) {
	console.log(s);
	var num = parseInt(s);
	num *= 2;
	return num + 'px';
});
console.log(result);

// 量词
// {n} 出现n次
// {n,} >=n次
// {m,n} 出现m-n次
// + 至少出现1次
// ? 出现0次或者1次
// * 出现 >= 0次

// b出现两次
reg = /ab{2}/;
console.log(reg.test("abab"));

// 定位符
// ^ 限定在开头出现
// $ 限定在结尾出现
// \b 匹配单词的左右边界

// 是不是abc开头
reg = /^abc/;
str = "abcsdf";
console.log(reg.test(str));

// 是不是.jpg结尾
reg = /\.jpg/;
str = "a.jpg";
console.log(reg.test(str));

// 匹配abc
reg = /^abc$/;
str = "abc";
console.log(reg.test(str));

reg = /\bmo/g;
str = "money moon mo amo";
result = str.replace(reg, "II");
console.log(result);

reg = /mo\b/g;
result = str.replace(reg, "YY");
console.log(result);

// 只能匹配mo单词
reg = /\bmo\b/;
result = str.replace(reg, 'XX');
console.log(result);


// 分组符 ()
str = "abb";
// 匹配的abb
reg = /ab{2}/;
console.log(reg.test(str));
// 匹配的abab
reg = /(ab){2}/;
console.log(reg.test(str));

// |
str = "Hello hello";
reg = /(H|h)ello/g;
console.log(str.match(reg));

// 转义字符 \
// 有些字符在有些情况下需要添加转义字符
// ., $, ^, {, }, [, ], (, ), |, *, +, ?, \, /等等
// reg = /\[/;
reg = /[a\-b]/;
str = "[sdj-f";
console.log(reg.test(str));














